package my.test;

import java.lang.reflect.Proxy;

/**
 * 代理测试1 代理目标为类的实例
 */
public class ProxyTest1 {
    public static void main(String[] args) {
        // 要代理的目标
        Person person = new Man("杰克");
        // 创建代理
        Person proxy = ProxyTest1.createProxy(person);
        // 执行代理类的方法
        proxy.say();
    }

    public static Person createProxy(Person person) {
        return (Person) Proxy.newProxyInstance(
                person.getClass().getClassLoader(),
                person.getClass().getInterfaces(), // 关键：对象类实现的接口
                (proxy, method, args) -> {
                    if ("say".equals(method.getName())) {
                        System.out.println("调用say之前。。。");
                        Object ret = method.invoke(person, args);
                        System.out.println("调用say之后。。。");
                        return ret;
                    }
                    return null;
                }
        );
    }
}

/**
 * 定义一个接口
 */
interface Person {
    void say();
}

/**
 * 定义一个类，实现接口
 */
class Man implements Person {
    private String name;

    public Man(String name) {
        this.name = name;
    }

    @Override
    public void say() {
        System.out.println("我是个 Man, 我的名字是 " + name + "。");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}